#pragma once

#include "Reactor.hpp"
#include"Callback.hpp"
#include"sock.h"
#include<iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using ns_reactor::Event;

void Accepter(Event &event)
{
    std::cout << "Accepter 回调方法被调用" << std::endl;

    while (true)
    {
        struct sockaddr_in prev;
        socklen_t len = sizeof(prev);
        int sock=accept(event.sock_,(struct sockaddr*)&prev,&len);
        if(sock>0)
        {
            //构建新的与sock对应的Event对象
            Event ev;
            ev.sock_=sock;
            ev.r_=event.r_;
            //为支持ET模式，把文件描述符设置为非阻塞
            ns_sock::Sock::SetNonBlock(sock);
            //注册回调
            ev.RegisterCallback(Recver,Sender,Errorer);
            //添加到epoll模型中
            event.r_->AddEvent(ev,EPOLLIN|EPOLLET);
            //默认添加为监听读事件
        }
        else
        {
            if(errno==EINTR)
            {
                //当前的accept调用，被信号中断，并不代表底层没有新的链接
                continue;
            }
            else if(errno==EAGAIN||errno==EWOULDBLOCK)
            {
                //当前出错返回，但是不是真正意义上出错了，而是底层没有链接了
                break;
            }
            else
            {
                //真正意义上面的accept读取出错
                std::cerr<<"accept error: "<<errno<<std::endl;
                continue;
            }
        }
    }
}